<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>

        // 1. Map 和 WeakMap 数据
        // Map 可以让任意数据类型作为数据的键，最终生成的是一个类似对象的东西
        const obj = {
            a: 10
        };

        const arr = [
            [true, 'ouzhou'],
            [obj, 'zouweiliang'],
            [undefined, 'mayin']
        ];

        const data = new Map(arr);
        // console.log(data);

        // console.log(typeof data); // Object
        // console.log(Object.prototype.toString.call(data).slice(8, -1)); // Map
        // 枚举不到
        // for (const key in data) {
        //     console.log(key);
        // }

        // for (const item of data) {
        //     // console.log(item);
        //     console.log(item[0], item[1]);
        // }

        // 2. Map 数据的方法
        // console.log(data.set(/abc/g, '正则表达式'));
        // console.log(data.get(undefined));
        // console.log(data.keys());
        // console.log(data.values());
        // console.log(data.entries()); // 可以调用next方法
        // console.log(data);

        // 3. WeakMap 弱Map数据
        // 要求键必须是对象类型的数据
        function fn() { }
        // 只支持 get,set,delete,has
        const datas = new WeakMap([
            [[1], 10],
            [{}, 20],
            [fn, 30]
        ]);

        // 不能以任何方式操作，除非其自身提供的方法
        console.log(datas);
        console.log(datas.get(fn));

    </script>
</body>

</html>